//Проверяет, определена ли переменная
function isset(mixed_var) {
  var i = 0, argc = arguments.length, argv = arguments, set=true;
  for (i = 0; i< argc; i++){
    if ( argv[i] === undefined ){
      set = false;
      break;
    }
  }
  return set;
}

// Удаление лишних прбельных символов, аналогичная функция из PHP
function trim(str, charlist) {
    charlist = !charlist ? ' \s\xA0' : charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
    var re = new RegExp('^[' + charlist + ']+|[' + charlist + ']+$', 'g');
    return str.replace(re, '');
};

//Проверяет, является ли переменная массивом
function is_array( mixed_var ) {
    return ( mixed_var instanceof Array );
}

//Проверяет, является ли переменная пустой (работает для всех типов данных)
function empty( mixed_var ) {
    return ( mixed_var === "" || mixed_var === 0   ||
             mixed_var === "0" || mixed_var === null  ||
             mixed_var === false  ||  ( is_array(mixed_var) && mixed_var.length === 0 ) );
}

//Функция "расписывает" содержимое массива. Параметр level указывает глубину прохода по массиву
function print_r(arr, level) {
    var print_red_text = "";
    if (!level) level = 0;
    var level_padding = "";
    for(var j=0; j<level+1; j++) level_padding += "    ";
    if (typeof(arr) == 'object') {
        for(var item in arr) {
            var value = arr[item];
            if (typeof(value) == 'object') {
                print_red_text += level_padding + "'" + item + "' :\n";
                print_red_text += print_r(value,level+1);
		}
            else
                print_red_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
        }
    }

    else  print_red_text = "===>"+arr+"<===("+typeof(arr)+")";
    return print_red_text;
}

//Функция организует замыкание при вызове функции
function MakeCaller ( func, arg ) {
  return function () { func( arg ); };
};

//Функция организует замыкание при вызове функции
function MakeCaller2 ( func, arg1, arg2) {
  return function () { func(  arg1, arg2 ); };
};

//Функция возвращает целочисленное значение
function intval( mixed_var, base ) {    // Get the integer value of a variable
    var tmp;
    if ( typeof( mixed_var ) == 'string' ){
        tmp = parseInt(mixed_var);
        if (isNaN(tmp)){
            return 0;
        } else{
            return tmp.toString(base || 10);
        }
    } else if ( typeof( mixed_var ) == 'number' ){
        return Math.floor(mixed_var);
    } else{
        return 0;
    }
};

// функция проверяет, находится ли переменная в массиве. Параметр strict определяет тип сравнения - по === или ==
function in_array(needle, haystack, strict) {
    var found = false, key, strict = !!strict;
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }
     return found;
};

/*
Выполняется автоматически (для некоторых версий браущеров, где не определён этот метод)
*/
if (!Array.indexOf){
    Array.prototype.indexOf = function(obj){
	for(var i=0; i<this.length; i++){
	    if (this[i]==obj){
	        return i;
	    }
	}
	return -1;
    }
}

// метод определяет значение свойсвта margin-top и ему подобных по строке margin
function getMarginsByStrOfMargin(strMargin, type) {
	strMargin = strMargin.toLowerCase();
	var currentPosition;
	var top = 0;
	var right = 0;
	var bottom = 0;
	var left = 0;

	currentPosition = strMargin.indexOf('px');
	if (currentPosition > 0) {
		left = bottom = right = top = intval(strMargin);
		strMargin = strMargin.substr(currentPosition + 2);
		currentPosition = strMargin.indexOf('px');
		if (currentPosition > 0) {
			left = right = intval(strMargin);
			strMargin = strMargin.substr(currentPosition + 2);
			currentPosition = strMargin.indexOf('px');
			if (currentPosition > 0) {
				bottom = intval(strMargin);
				strMargin = strMargin.substr(currentPosition + 2);
				currentPosition = strMargin.indexOf('px');
				if (currentPosition > 0) {
					left = intval(strMargin);
				}
			}
		}
	};
	if (type == 'top') return top;
	else if (type == 'right') return right;
	else if (type == 'bottom') return bottom;
	else if (type == 'left') return left;
	else return top;
};

/**
* проверяет, впервые ли нажат элемент
* полезно при добавлении новых элементов через Ajax
*/
function isItNewElementPress(element) {
  if ($(element).attr('pressed') == 'yes') // Если кнопку удаления уже нажимали
	  return false;
	$(element).attr('pressed', 'yes');
	return true;
}

function user(){
	this.loggedIn = false;
};
user.logInCheck = function(option){
	this.loggedIn = option.loggedIn;
}
user.check = function(element){
	if (this.loggedIn != 1) {
		//alert("Для совершения выбранного действия необходимо авторизоваться");
		showWindowForUnreg(element);
		return false;
	}
	return true;
}

function cleanArray(actual){
  var newArray = new Array();
  for(var i = 0; i<actual.length; i++){
      if (actual[i]){
        newArray.push(actual[i]);
    }
  }
  return newArray;
}


// функция получает информацию о свойствах объекта
function fnShowProps(obj, objName){
    var result = "";
    for (var i in obj) // обращение к свойствам объекта по индексу
        result += objName + "." + i + " = " + obj[i] + "\n";
//    document.write (result);
    alert (result);
};